const formidable = require('formidable');
const path=require('path')
const fs=require('fs')
const modify=require('../../util/modifyFilePath')//引入修改文件方法
const uploadPath='../../public/imgs'//指定上传路径
const config=require("../../config/environment")
const MaxFileNum=10//最大上传文件个数

//上传文件方法
const upload=(req,res,uploadPath,limitFileType,isReturnOriginName,maxFileSize) => {
    //uploadPath:上传文件的路径，是一个字符串
    //limitFileType:上传文件类型限制，是一个数组，数组元素是文件后缀字符串
    //isReturnOriginName:是否返回原始文件名，True则返回，False则不返回
    //maxFileSize:限制上传文件大小

    var paths=[]//这里存储总共上传的文件名
    var temp=[]//存储暂时保存的文件，因为会上传失败，需要删除文件
    const form = formidable({ multiples: true });

    form.uploadDir = path.join(__dirname,uploadPath)//确定上传路径

    form.multiples=true//上传多个文件，使得parse里面的files参数变为数组

    // form.maxFileSize=5*1024*1024//限制上传文件大小，作为参数，就不使用了

    form.allowEmptyFiles=false//不允许上传空文件

    var num=0//记录总共的文件上传个数

    return new Promise(function(resolve, reject) {

        //我在这里进行文件类型的过滤
        form.onPart=(part)=>{
            num++//文件个数递增
            const extname=path.extname(part.originalFilename)
            //这里判断文件夹是否存在
            let filepath=path.join(__dirname,uploadPath)
            // 调用mkdirSync同步创建文件夹
            if(!fs.existsSync(filepath)){
                fs.mkdirSync(filepath)
            }

            if(limitFileType.includes(extname)&&(part.name=="up")&&num<=MaxFileNum){//限制文件类型和字段名
              form._handlePart(part)//执行这个才能开始接收数据
            }else{
                // 调用下面的错误函数
                form.emit('error',"上传文件出错")
            }
        }

        //开始上传文件的时候触发
        form.on('fileBegin', function(name, file){
            temp.push(file.newFilename)
        })

        //当文件传输出现问题时触发
        form.on("error", (err)=>{
            resolve(400)
        })

        //数据处理的时候触发，当然，可以通过这里的文件大小，限制文件文件上传大小
        form.on('progress', (bytesReceived, bytesExpected)=> {//数据处理的时候触发，当然，可以通过这里的文件大小，限制文件文件上传大小
            if(bytesExpected>maxFileSize){
                if(temp.length>0){
                    temp.forEach(name=>{//这里循环将未成功上传的文件删除
                        fs.unlinkSync(uploadPath+'/'+name)
                    })
                }
                form.emit('error',"文件过大，无法上传")//后面的数据未使用
                return
            }else{
                // console.log(bytesReceived/bytesExpected*100+"%")
                //以后通过这里，使用websocket将文件进度返回给客户端并进行显示
            }
        })

        //上传文件处理
        form.parse(req,async (err, fields, files) => {
            if (err) {
                return;
            }
            const up=files.up//这里的up是前端传过来的表单参数名称
            //上传多个文件的时候
            if(Array.isArray(up)){//判断是否为数组
                await files.up.forEach(async file=>{
                    console.log(file)
                    //是否需要新文件名和原文件名同时返回
                    if(isReturnOriginName){
                        var newname=await modify(file.newFilename,file.originalFilename,uploadPath)
                        paths.push({
                            newname,
                            originalName:file.originalFilename
                        })
                    }else{
                        var newname=await modify(file.newFilename,file.originalFilename,uploadPath)
                        paths.push(newname)
                    }
                })
            }else{
                //上传一个文件的时候
                //是否需要新文件名和原文件名同时返回
                
                //当上传空文件时，up为undefined，需要排除这个情况
                if(!up){
                    resolve(paths)
                    return
                }
                if(isReturnOriginName){
                    var newname=await modify(up.newFilename,up.originalFilename,uploadPath)
                    paths.push({
                        newname,
                        originalName:up.originalFilename
                    })
                }else{
                    var newname=await modify(up.newFilename,up.originalFilename,uploadPath)
                    paths.push(newname)
                }
            }
            //返回所有组成路径
            resolve(paths)
        });
    }).catch(err=>{
        console.log(err)
    })

}

//上传图片
const uploadImg=async (req, res)=>{
    // const result=await upload(req,res,)
    const fileType=['.jpg','.jpeg','.png','.gif','.pdf']//限制文件上传格式
    maxFileSize = 10*1024*1024
    const result=await upload(req,res,uploadPath,fileType,true,maxFileSize)
    if(result!=400){
        res.status(200).send({result})
    }else{
        res.status(400).send("上传文件失败")
    }
    // res.send("nihao")
}

module.exports={
    upload,
    uploadImg
}